<template>
  <div>
    <textarea ref="textarea">
白日依山尽，黄河入海流。
欲穷千里目，更上一层楼。
        </textarea
    >
  </div>
</template>

<script lang="ts">
  import { defineComponent, onMounted, ref, reactive } from "vue"
  // 引入全局实例
  import _CodeMirror from "codemirror"

  // 核心样式
  import "codemirror/lib/codemirror.css"
  // 引入主题后还需要在 options 中指定主题才会生效
  import "codemirror/theme/cobalt.css"

  // 需要引入具体的语法高亮库才会有对应的语法高亮效果
  // codemirror 官方其实支持通过 /addon/mode/loadmode.js 和 /mode/meta.js 来实现动态加载对应语法高亮库
  // 但 vue 貌似没有无法在实例初始化后再动态加载对应 JS ，所以此处才把对应的 JS 提前引入
  import "codemirror/mode/javascript/javascript.js"
  import "codemirror/mode/css/css.js"
  import "codemirror/mode/xml/xml.js"
  import "codemirror/mode/clike/clike.js"
  import "codemirror/mode/markdown/markdown.js"
  import "codemirror/mode/python/python.js"
  import "codemirror/mode/r/r.js"
  import "codemirror/mode/shell/shell.js"
  import "codemirror/mode/sql/sql.js"
  import "codemirror/mode/swift/swift.js"
  import "codemirror/mode/vue/vue.js"
  // 尝试获取全局实例

  export default defineComponent({
    components: {},
    setup() {
      const CodeMirror = window.CodeMirror || _CodeMirror

      const textarea = ref(null)
      const options = reactive({
        // 缩进格式
        tabSize: 2,
        // 主题，对应主题库 JS 需要提前引入
        theme: "cobalt",
        // 显示行号
        lineNumbers: true,
        line: true,
      })
      onMounted(() => {
        init()
      })

      function init() {
        CodeMirror.fromTextArea(textarea.value, options)
      }

      return {
        textarea,
      }
    },
  })
</script>

<style lang="css" scoped></style>
